
//523.连续的子数组和
class Solution {
public:
    bool checkSubarraySum(vector<int>& nums, int k) {
        //此题有限制: 长度至少为2,所以在将子数组的前缀和加入到哈希表中时要间隔一个数加入
        //此题要求子数组的和必须是k的整数倍,也就是说对于区间[left,right]是[0,right]-[0,left]
        //如果两者的余数相减为0,即两个数的余数相等就满足是k的整数倍

        int n = nums.size();
        if(n < 2) return false;
        unordered_map<int,int> m ;//记录前缀和以及个数
        m.insert({0,1});
        long long sum = nums[0] + nums[1],tmp = 0;
        if(sum%k == 0) return true;

        for(int i = 2; i < n ;i++)
        {
            sum += nums[i];
            tmp += nums[i-2];           //中间隔两个开始计数
            m[tmp%k]++;                 //添加到哈希表中
            if(m.count(sum%k)) return true;
        }
        return false;
    }
};